"""
# 私有化:
    __属性： 只能在类中赋值和修改， 访问权限进限制于类里边
    好处：
        隐藏属性，不被随意修改
        可以通过提供的set_属性名()函数进行修改（对外的通用接口）
            可以通过set_属性名()进行限制判断
    # attribute:
        get_age', 'get_name', 'set_age', 'set_name', 'set_score
        '_Student__age', '_Student__name', '_Student__score'
封装:
    私有化属性、定义公有的set get方法;
继承：

多态：
"""


class Student:
    # __age = 19  # 类属性
    # __score = 59

    def __init__(self, name, age):
        self.__name = name
        self.__age = age
        self.__score = 50

    def __str__(self):
        return "姓名是：" + self.__name + ",年龄：" + str(self.__age) + ",分数：" + str(self.__score)

    # 定义公有的get和set方法
    def set_age(self, age):
        if age < 0 or age > 120:
            print("年龄没有在合理范围内")
        else:
            self.__age = age

    def get_age(self):
        return self.__age

    def set_score(self, score):
        self.__score = score

    def set_name(self, name):
        if len(name) > 6:
            print("名字长度不能超过六位")
        else:
            self.__name = name

    def get_name(self):
        return self.__name


s = Student("张三", 18)
print(s)
s.set_age(28)
print(s)
s1 = Student("李四", 20)

s1.set_age(128)
print(s1)

s1.set_name("tomorrow")
print(s1)
s1.set_name("lucy")
print(s1)
print(s1.get_name())
print(s1._Student__name)  # 底层做了伪封装，不建议这么使用，建议通过set和get访问；_Student__name系统将私有化的属性修改的名称

print(dir(Student))

print(dir(s1))
